共计 3843 个字符,预计需要花费 10 分钟才能阅读完成。
ImageMagick 是一款功能强大且广泛使用的开源图像处理工具套件,支持多种编程语言调用,适用于脚本化或自动化图像处理。
优点:
-
跨平台支持
- 支持 Linux、Windows、macOS,兼容性强。
-
多格式处理
- 支持 200+ 图像格式(如 PNG、JPEG、TIFF、PDF、SVG),甚至可处理 RAW 相机文件。
-
脚本化能力
- 通过命令行(
convert、mogrify等)批量处理图像,适合自动化任务。
- 通过命令行(
-
高级功能
- 支持复杂操作:合成、蒙版、色彩空间转换、动态 GIF 生成、文本渲染等。
-
编程接口
- 提供 Perl、Python、PHP、C/C++ 等语言的 API,方便集成到应用中。
-
开源免费
- 采用 Apache 2.0 许可证,可自由使用和修改。
缺点:
-
内存消耗大
- 处理大文件或批量操作时可能占用较高内存。
-
安全风险
- 过去曾曝出漏洞(如
Ghostscript依赖导致的远程执行漏洞),需保持版本更新。
- 过去曾曝出漏洞(如
-
性能局限
- 某些操作(如超大图像处理)速度较慢,不如专用工具(如 libvips)。
安装 ImageMagick
打开 终端.app 复制粘贴并执行下面的代码即可:
# 需要先安装 Homebrew 软件包管理系统
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 如果已经安装过 Homebrew 则可以忽略上面的指令,直接执行下面这条
brew install imagemagick
# 验证是否安装成功
convert -version
结果如图显示:

ImageMagick + 自建 API
通过 API 接口指令自动批量处理图片的尺寸和体积,可以结合 Web 框架封装为 API 接口:
from flask import Flask, request, send_file
import subprocess
import os
app = Flask(__name__)
@app.route('/resize', methods=['POST'])
def resize_image():
file = request.files['image']
width = request.form.get('width', '500')
height = request.form.get('height', '500')
input_path = '/tmp/input.jpg'
output_path = '/tmp/output.jpg'
file.save(input_path)
subprocess.run(['convert', input_path, '-resize', f'{width}x{height}', output_path])
return send_file(output_path, as_attachment=True)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
FFmpeg + ImageMagick 组合的完整工作流
FFmpeg 和 ImageMagick 的组合在多媒体处理中非常强大,FFmpeg 擅长视频 / 音频处理,而 ImageMagick 专注于静态 / 动态图像的高级编辑 ,两者结合可以覆盖从视频帧提取、图像处理到动态图像生成的完整工作流。
视频帧提取 + 图像处理
从视频中提取关键帧并批量处理(如加水印、调色、压缩):
# 提取视频所有帧为 PNG
ffmpeg -i input.mp4 frame_%04d.png
# 使用 ImageMagick 批量处理,如缩放到 50% 并转灰度
mogrify -resize 50% -colorspace Gray frame_*.png
# 将处理后的帧重新合成为视频
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 output.mp4
GIF/ 动态图像生成
将视频片段转为高质量 GIF 或 APNG,因为 FFmpeg 提取帧 + ImageMagick 优化,如调色、降噪、压缩,比单独使用任一工具效果更好:
# 用 FFmpeg 提取视频片段为 PNG 序列
ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -vf fps=15 frame_%04d.png
# 用 ImageMagick 生成优化后的 GIF 减少颜色数、优化帧
convert -delay 7 -loop 0 frame_*.png -layers Optimize output.gif
视频加水印
在视频每一帧叠加动态水印(如透明 PNG 或文字):
# 生成文字 + 透明度的水印图
convert -size 300x100 xc:none -font Arial -pointsize 30 -fill white -draw "text 10,50 'My Watermark'" -channel A -evaluate multiply 0.5 watermark.png
# 用 FFmpeg 叠加水印,例如位置在右下角
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4
视频缩略图 / 封面生成
从视频中提取关键帧并拼合成缩略图网格:
# 用 FFmpeg 每 10 秒提取一帧
ffmpeg -i input.mp4 -vf fps=1/10 thumb_%02d.jpg
# 用 ImageMagick 拼合为 3x3 网格
montage thumb_*.jpg -tile 3x3 -geometry +5+5 collage.jpg
通过脚本自动运行 ImageMagick 批量处理压缩包里的图片
创建一个名为 process_images.sh 的脚本文件,粘贴如下内容:
#!/bin/bash
# 设置日志函数
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# 检查是否安装了 optipng,如果没有则安装
if ! command -v optipng &> /dev/null; then
log " 正在安装 optipng..."
brew install --quiet optipng || log " 警告: 无法安装 optipng,PNG 优化将被跳过 "
fi
# 查找当前目录下的所有 zip 文件
zip_files=$(find . -maxdepth 1 -type f -name "*.zip")
# 检查是否找到 zip 文件
if [-z "$zip_files"]; then
log " 错误: 当前目录下没有找到 zip 文件 "
exit 1
fi
# 处理每个 zip 文件
for input_zip in $zip_files; do
# 获取不带路径和扩展名的文件名
filename=$(basename "$input_zip" .zip)
output_dir="${filename}_extracted"
processed_zip="${filename}_processed.zip"
log " 处理压缩包: $input_zip"
# 创建输出目录
mkdir -p "$output_dir"
# 解压文件
log " 解压到目录: $output_dir"
unzip -q "$input_zip" -d "$output_dir"
# 进入输出目录
cd "$output_dir" || {log " 错误: 无法进入目录 $output_dir"; continue;}
# 创建原始图片备份
log " 创建原始图片备份 "
mkdir -p original_backup
# 查找所有图片文件并复制到备份目录
find . -maxdepth 1 -type f \(-name "*.jpg" -o -name "*.jpeg" -o -name "*.png" \) -exec cp {} original_backup/ \;
# 处理图片
jpg_files=$(find . -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.jpeg" \))
png_files=$(find . -maxdepth 1 -type f -name "*.png")
if [-n "$jpg_files"]; then
log " 调整 JPG/JPEG 图片大小和质量 "
mogrify -resize 800x $jpg_files
mogrify -quality 80% $jpg_files
fi
if [-n "$png_files"] && command -v optipng &> /dev/null; then
log " 优化 PNG 图片 "
optipng -o7 $png_files 2>/dev/null || log " 警告: PNG 优化失败 "
fi
# 返回上级目录
cd ..
# 创建处理后的压缩包
log " 创建处理后的压缩包: $processed_zip"
zip -rq "$processed_zip" "$output_dir"
log " 完成处理: $input_zip -> $processed_zip"
done
log " 所有压缩包处理完成 "
脚本说明:
- 自动检测功能 :使用
find命令查找当前目录下的所有.zip文件 - 动态命名 :根据输入文件名自动生成输出目录和处理后的压缩包名称
- 健壮性增强 :
- 添加了日志功能,便于跟踪处理过程
- 增加了错误处理和检查
- 使用
find命令查找图片文件,避免通配符匹配失败的问题
- 批量处理 :可以一次处理多个压缩包文件
- 保留原功能 :保留了原脚本中的图片处理功能(调整大小、优化质量、PNG 压缩)
这个脚本会自动检测当前目录下的所有 .zip 文件,并为每个文件创建相应的处理流程,最终生成处理后的压缩包。
全文完